package cn.ryh.po;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @ClassName TestAopAnnotation
 * @Description 用于测试Aop注解
 * @Author RaoYH
 */
@Component
@Aspect
public class TestAopAnnotation {

    /**
     * 配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
     */
    @Pointcut(value = "execution(* cn.ryh.po.TestAop.*(..))")
    public void aspect(){	}
    /**
     * 前置通知,
     * value = "aspect()"表示使用在方法aspect()上注册的切入点
     */
    @Before(value = "aspect()")
    public void before(){
        System.out.println("前置通知");
    }

    /**
     * 后置通知
     */
    @After(value = "execution(* cn.ryh.po.TestAop.testAfter(..))")
    public void after(){
        System.out.println("后置通知");
    }

    /**
     * 异常通知
     */
    @AfterThrowing(value = "execution(* cn.ryh.po.TestAop.testAfterThrowing(..))")
    public void AfterThrowing(){
        System.out.println("异常通知");
    }

    /**
     * 最终通知
     */
    @AfterReturning(value = "execution(* cn.ryh.po.TestAop.testAfterReturning(..))")
    public void AfterReturning(){
        System.out.println("最终通知");
    }

    /**
     * 环绕通知
     */
    @Around(value = "execution(* cn.ryh.po.TestAop.*(..))")
    public void Around(ProceedingJoinPoint pjd) throws Throwable {
        //方法之前
        System.out.println("方法执行之前:环绕通知");
        //执行被增强的方法
        pjd.proceed();
        //方法之后
        System.out.println("方法执行之后:环绕通知");
    }

}
